package daemon

import (
	"fmt"
	"os"
	"os/signal"
	"syscall"

	"go.uber.org/zap"
)

// DaemonManager 守护进程管理器
type DaemonManager struct {
	daemon *Daemon
}

// NewDaemonManager 创建守护进程管理器
func NewDaemonManager(daemon *Daemon) *DaemonManager {
	return &DaemonManager{
		daemon: daemon,
	}
}

// Start 启动守护进程
func (dm *DaemonManager) Start() error {
	zap.L().Info("启动SSH升级守护进程")

	// 检查是否已经运行
	if dm.daemon.isRunning() {
		return fmt.Errorf("守护进程已经在运行")
	}

	// 创建PID文件
	if err := dm.daemon.fileUtils.CreatePIDFile(dm.daemon.pidFile); err != nil {
		return fmt.Errorf("创建PID文件失败: %v", err)
	}

	// 设置信号处理
	dm.setupSignalHandler()

	// 标记为运行状态
	dm.daemon.running = true

	// 启动主循环
	go dm.daemon.mainLoop()

	zap.L().Info("SSH升级守护进程启动成功")
	return nil
}

// Stop 停止守护进程
func (dm *DaemonManager) Stop() error {
	zap.L().Info("停止SSH升级守护进程")

	if !dm.daemon.running {
		zap.L().Info("守护进程未运行")
		return nil
	}

	// 标记为停止状态
	dm.daemon.running = false

	// 删除PID文件
	if err := dm.daemon.fileUtils.RemovePIDFile(dm.daemon.pidFile); err != nil {
		zap.L().Warn("删除PID文件失败", zap.Error(err))
	}

	zap.L().Info("SSH升级守护进程停止成功")
	return nil
}

// Status 获取守护进程状态
func (dm *DaemonManager) Status() (map[string]interface{}, error) {
	status := make(map[string]interface{})
	status["running"] = dm.daemon.running
	status["config_file"] = dm.daemon.configFile
	status["pid_file"] = dm.daemon.pidFile
	status["log_file"] = dm.daemon.logFile
	status["interval"] = dm.daemon.interval.String()

	// 检查PID文件是否存在
	if dm.daemon.fileUtils.IsProcessRunning(dm.daemon.pidFile) {
		status["pid_file_exists"] = true
		if pid, err := dm.daemon.fileUtils.ReadPIDFromFile(dm.daemon.pidFile); err == nil {
			status["pid"] = pid
		}
	} else {
		status["pid_file_exists"] = false
	}

	return status, nil
}

// setupSignalHandler 设置信号处理器
func (dm *DaemonManager) setupSignalHandler() {
	sigChan := make(chan os.Signal, 1)
	signal.Notify(sigChan, syscall.SIGINT, syscall.SIGTERM)

	go func() {
		sig := <-sigChan
		zap.L().Info("接收到信号", zap.String("signal", sig.String()))
		dm.Stop()
		os.Exit(0)
	}()
}

// RunDaemonLoop 运行守护进程主循环
func (dm *DaemonManager) RunDaemonLoop() int {
	zap.L().Info("启动SSH自动升级守护进程")

	// 启动守护进程
	if err := dm.Start(); err != nil {
		zap.L().Error("守护进程启动失败", zap.Error(err))
		return 1
	}

	// 等待守护进程运行
	select {}
}

// IsRunning 检查守护进程是否在运行
func (dm *DaemonManager) IsRunning() bool {
	return dm.daemon.fileUtils.IsProcessRunning(dm.daemon.pidFile)
}

// GetDaemon 获取守护进程实例
func (dm *DaemonManager) GetDaemon() *Daemon {
	return dm.daemon
}